」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 掌握影像分割:傳統技術如何在數位時代仍然大放異彩

掌握影像分割:傳統技術如何在數位時代仍然大放異彩

發佈於2024-11-08
瀏覽:177

介绍

图像分割是计算机视觉中最基本的过程之一,它允许系统分解和分析图像内的各个区域。无论您是在处理对象识别、医学成像还是自动驾驶,分割都可以将图像分解为有意义的部分。

尽管深度学习模型在这项任务中越来越受欢迎,但数字图像处理中的传统技术仍然强大且实用。本文回顾的方法包括阈值处理、边缘检测、基于区域和通过实施公认的细胞图像分析数据集(MIVIA HEp-2 图像数据集)进行聚类。

MIVIA HEp-2 图像数据集

MIVIA HEp-2 图像数据集是一组细胞图片,用于分析 HEp-2 细胞中的抗核抗体 (ANA) 模式。它由通过荧光显微镜拍摄的二维图片组成。这使得它非常适合分割任务,最重要的是那些与医学图像分析有关的任务,其中细胞区域检测是最重要的。

现在,让我们继续讨论用于处理这些图像的分割技术,根据 F1 分数比较它们的性能。


1. 阈值分割

阈值处理是根据像素强度将灰度图像转换为二值图像的过程。在 MIVIA HEp-2 数据集中,此过程对于从背景中提取细胞非常有用。它在很大程度上是简单有效的,特别是使用大津方法,因为它会自动计算最佳阈值。

Otsu 的方法 是一种自动阈值方法,它试图找到最佳阈值以产生最小的类内方差,从而分离两个类:前景(细胞)和背景。该方法检查图像直方图并计算完美阈值,其中每个类别中的像素强度方差的总和最小化。

# Thresholding Segmentation
def thresholding(img):
    # Convert image to grayscale
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

    # Apply Otsu's thresholding
    _, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY   cv.THRESH_OTSU)

    return thresh

Mastering Image Segmentation: How Traditional Techniques Still Shine in the Digital Age


2. 边缘检测分割

边缘检测涉及识别对象或区域的边界,例如 MIVIA HEp-2 数据集中的细胞边缘。在用于检测突然强度变化的许多可用方法中,Canny 边缘检测器 是最好的,因此也是最适合用于检测细胞边界的方法。

Canny 边缘检测器 是一种多阶段算法,可以通过检测强度梯度较强的区域来检测边缘。该过程包括使用高斯滤波器进行平滑、计算强度梯度、应用非极大值抑制来消除寄生响应,以及最终的双阈值操作以仅保留显着边缘。

# Edge Detection Segmentation
def edge_detection(img):
    # Convert image to grayscale
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

    # Apply Gaussian blur
    gray = cv.GaussianBlur(gray, (3, 3), 0)

    # Calculate lower and upper thresholds for Canny edge detection
    sigma = 0.33
    v = np.median(gray)
    lower = int(max(0, (1.0 - sigma) * v))
    upper = int(min(255, (1.0   sigma) * v))

    # Apply Canny edge detection
    edges = cv.Canny(gray, lower, upper)

    # Dilate the edges to fill gaps
    kernel = np.ones((5, 5), np.uint8)
    dilated_edges = cv.dilate(edges, kernel, iterations=2)

    # Clean the edges using morphological opening
    cleaned_edges = cv.morphologyEx(dilated_edges, cv.MORPH_OPEN, kernel, iterations=1)

    # Find connected components and filter out small components
    num_labels, labels, stats, _ = cv.connectedComponentsWithStats(
        cleaned_edges, connectivity=8
    )
    min_size = 500
    filtered_mask = np.zeros_like(cleaned_edges)
    for i in range(1, num_labels):
        if stats[i, cv.CC_STAT_AREA] >= min_size:
            filtered_mask[labels == i] = 255

    # Find contours of the filtered mask
    contours, _ = cv.findContours(
        filtered_mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE
    )

    # Create a filled mask using the contours
    filled_mask = np.zeros_like(gray)
    cv.drawContours(filled_mask, contours, -1, (255), thickness=cv.FILLED)

    # Perform morphological closing to fill holes
    final_filled_image = cv.morphologyEx(
        filled_mask, cv.MORPH_CLOSE, kernel, iterations=2
    )

    # Dilate the final filled image to smooth the edges
    final_filled_image = cv.dilate(final_filled_image, kernel, iterations=1)

    return final_filled_image

Mastering Image Segmentation: How Traditional Techniques Still Shine in the Digital Age


3. 基于区域的分割

基于区域的分割根据某些标准(例如强度或颜色)将相似的像素分组到区域中。 分水岭分割技术可用于帮助分割 HEp-2 细胞图像,以便能够检测代表细胞的那些区域;它将像素强度视为地形表面并勾勒出区分区域的轮廓。

分水岭分割将像素的强度视为地形表面。该算法识别“盆地”,在其中识别局部最小值,然后逐渐淹没这些盆地以扩大不同的区域。当人们想要分离触摸物体时(例如显微图像中的细胞),这种技术非常有用,但它可能对噪声敏感。该过程可以通过标记来指导,并且通常可以减少过度分割。

# Region-Based Segmentation
def region_based(img):
    # Convert image to grayscale
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

    # Apply Otsu's thresholding
    _, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV   cv.THRESH_OTSU)

    # Apply morphological opening to remove noise
    kernel = np.ones((3, 3), np.uint8)
    opening = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=2)

    # Dilate the opening to get the background
    sure_bg = cv.dilate(opening, kernel, iterations=3)

    # Calculate the distance transform
    dist_transform = cv.distanceTransform(opening, cv.DIST_L2, 5)

    # Threshold the distance transform to get the foreground
    _, sure_fg = cv.threshold(dist_transform, 0.2 * dist_transform.max(), 255, 0)
    sure_fg = np.uint8(sure_fg)

    # Find the unknown region
    unknown = cv.subtract(sure_bg, sure_fg)

    # Label the markers for watershed algorithm
    _, markers = cv.connectedComponents(sure_fg)
    markers = markers   1
    markers[unknown == 255] = 0

    # Apply watershed algorithm
    markers = cv.watershed(img, markers)

    # Create a mask for the segmented region
    mask = np.zeros_like(gray, dtype=np.uint8)
    mask[markers == 1] = 255

    return mask

Mastering Image Segmentation: How Traditional Techniques Still Shine in the Digital Age


4. 基于聚类的分割

诸如K-Means之类的聚类技术倾向于将像素分组到相似的聚类中,当想要在多色或复杂环境中分割细胞时,这种方法效果很好,如 HEp-2 细胞图像中所示。从根本上讲,这可以代表不同的类别,例如细胞区域与背景。

K-means 是一种基于颜色或强度的像素相似性对图像进行聚类的无监督学习算法。该算法随机选择K个质心,将每个像素分配给最近的质心,并迭代更新质心直至收敛。它对于分割具有多个彼此非常不同的感兴趣区域的图像特别有效。

# Clustering Segmentation
def clustering(img):
    # Convert image to grayscale
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

    # Reshape the image
    Z = gray.reshape((-1, 3))
    Z = np.float32(Z)

    # Define the criteria for k-means clustering
    criteria = (cv.TERM_CRITERIA_EPS   cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)

    # Set the number of clusters
    K = 2

    # Perform k-means clustering
    _, label, center = cv.kmeans(Z, K, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)

    # Convert the center values to uint8
    center = np.uint8(center)

    # Reshape the result
    res = center[label.flatten()]
    res = res.reshape((gray.shape))

    # Apply thresholding to the result
    _, res = cv.threshold(res, 0, 255, cv.THRESH_BINARY   cv.THRESH_OTSU)

    return res

Mastering Image Segmentation: How Traditional Techniques Still Shine in the Digital Age


使用 F1 分数评估技术

F1 分数 是一种将精度和召回率结合在一起的度量,用于将预测分割图像与地面真实图像进行比较。它是精度和召回率的调和平均值,在数据高度不平衡的情况下非常有用,例如在医学成像数据集中。

我们通过展平地面实况和分割图像并计算加权 F1 分数来计算每种分割方法的 F1 分数。

def calculate_f1_score(ground_image, segmented_image):
    ground_image = ground_image.flatten()
    segmented_image = segmented_image.flatten()
    return f1_score(ground_image, segmented_image, average="weighted")

然后我们使用简单的条形图可视化不同方法的 F1 分数:

Mastering Image Segmentation: How Traditional Techniques Still Shine in the Digital Age


结论

尽管最近出现了许多图像分割方法,但阈值处理、边缘检测、基于区域的方法和聚类等传统分割技术在应用于 MIVIA HEp-2 图像数据集等数据集时非常有用。

每种方法都有其优点:

  • 阈值适用于简单的二进制分割。
  • 边缘检测是边界检测的理想技术。
  • 基于区域的分割对于将连接的组件与其邻居分离非常有用。
  • 聚类方法非常适合多区域分割任务。

通过使用 F1 分数评估这些方法,我们了解了每个模型的权衡。这些方法可能不像最新的深度学习模型中开发的那么复杂,但它们仍然快速、可解释且可在广泛的应用中使用。


感谢您的阅读!我希望对传统图像分割技术的探索能够启发您的下一个项目。欢迎在下面的评论中分享您的想法和经验!

版本聲明 本文轉載於:https://dev.to/ahmedmbutt/mastering-image-segmentation-how-traditional-techniques-still-shine-in-the-digital-age-36fa?1如有侵犯,請洽study_golang@163 .com刪除
最新教學 更多>
  • 如何測驗 Cron 作業:完整指南
    如何測驗 Cron 作業:完整指南
    Cron 作业在许多系统中对于调度任务、自动化流程和按指定时间间隔运行脚本至关重要。无论您是维护 Web 服务器、自动备份还是运行例行数据导入,cron 作业都能让您的操作顺利运行。但与任何自动化任务一样,它们必须经过彻底测试以确保可靠性和准确性。 在本文中,我们将探讨如何有效地测试 cron 作...
    程式設計 發佈於2024-11-08
  • Next.js 中間件簡介:它如何運作並提供範例
    Next.js 中間件簡介:它如何運作並提供範例
    我們來談談Nextjs中的路由。今天,我們來談談最強大的事物中間件之一。 Nextjs 中的中間件提供了一種強大且靈活的方法來攔截來自伺服器的請求並控制請求流(重定向、URL 重寫)並全域增強身份驗證、標頭、cookie 持久性等功能。 建立中介軟體 讓我們建立 Middlewar...
    程式設計 發佈於2024-11-08
  • 道具基礎:第 1 部分
    道具基礎:第 1 部分
    這是一個關於如何使用道具的初學者友好教學。在閱讀之前了解什麼是解構以及如何使用/創建元件非常重要。 Props,properties的縮寫,props允許我們從父元件向子元件發送訊息,還需要注意的是它們可以是任何資料類型。 必須了解為任何元件建立 prop 的語法。在 React 中,您必須使用...
    程式設計 發佈於2024-11-08
  • Hibernate 與 Spring Boot 有何不同?
    Hibernate 與 Spring Boot 有何不同?
    Hibernate 與 Spring Boot 有何不同? Hibernate 和 Spring Boot 都是 Java 生態系中流行的框架,但它們有不同的用途並具有不同的功能。 休眠 Hibernate 是一個物件關聯映射 (ORM) 框架,它允許開發人員使用...
    程式設計 發佈於2024-11-08
  • C++ 如何處理十進位資料型別?
    C++ 如何處理十進位資料型別?
    C 中的十進位資料型別 C 提供了各種資料型別來處理數值,但令人驚訝的是,十進位資料型別本身不支援。在處理精確的十進制值或與使用十進制格式的系統互動時,這可能是一個限制。 實作選項雖然 C 不提供內建十進位類型,但有兩種與他們合作的方法:1。 C Decimal TR 擴充:某些編譯器(例如gcc)...
    程式設計 發佈於2024-11-08
  • 為什麼我的 Python 中的凱撒密碼函數只顯示最後一個移位的字元?
    為什麼我的 Python 中的凱撒密碼函數只顯示最後一個移位的字元?
    Python 中的凱撒密碼函數:加密字串在Python 中實作凱撒密碼函數時,會出現一個常見問題,即最終的加密文字僅顯示最後移動的字元。要解決此問題,有必要了解導致此行為的問題。 在提供的程式碼中,循環迭代明文中的每個字元。對於字母字符,它根據提供的移位值來移位字符的 ASCII 代碼。但是,每個移...
    程式設計 發佈於2024-11-08
  • 4 快速​​部署PHP
    4 快速​​部署PHP
    Servbay 已成為輕鬆配置開發環境的首要工具。在本指南中,我們將示範如何快速、安全地部署 PHP 8.2,強調 Servbay 致力於簡化部署流程。 先決條件 開始之前,請確保您的裝置上安裝了 Servbay。您可以直接從Servbay官方網站下載。安裝直覺;只需按照提示操作,...
    程式設計 發佈於2024-11-08
  • AngularJS 指令中的 Replace 屬性何時被棄用?
    AngularJS 指令中的 Replace 屬性何時被棄用?
    為什麼AngularJS 已棄用指令中的替換屬性AngularJS 指令中的替換屬性由於其複雜性和更好的出現而被棄用替代方案。根據官方 AngularJS API 文檔,在未來的版本中它將預設為 false。 棄用的原因AngularJS 團隊發現了替換屬性的幾個問題:困難的語義: 它導致了屬性合併...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 和 jQuery 中無縫存取 PHP 變數?
    如何在 JavaScript 和 jQuery 中無縫存取 PHP 變數?
    在JavaScript 或jQuery 中存取PHP 變數:避免Echo 過載許多開發人員遇到在JavaScript 和jQuery 中存取PHP 變數的挑戰。傳統方法涉及回顯 PHP 標籤內的變量,例如:<?php echo $variable1; ?> <?php echo $...
    程式設計 發佈於2024-11-08
  • 釋放 Claude AI:用於經濟實惠且靈活的 AI 整合的非官方 API
    釋放 Claude AI:用於經濟實惠且靈活的 AI 整合的非官方 API
    由 Anthropic 開發的 Claude AI 以其令人印象深刻的能力在人工智慧界掀起了波瀾。然而,官方 API 對於許多開發人員和小型企業來說可能過於昂貴。這就是我們的非官方 Claude AI API 的用武之地,它提供了一個更實惠、更靈活的解決方案,將 Claude 的力量整合到您的專案中...
    程式設計 發佈於2024-11-08
  • 如何使用時間包確定 Go 中一個月的最後一天?
    如何使用時間包確定 Go 中一個月的最後一天?
    使用Time.Time 確定給定月份的最後一天處理基於時間的資料時,通常需要確定指定月份的最後一天。無論該月有 28 天、29 天(閏年)還是 30 天或 31 天,這都會使這成為一項具有挑戰性的任務。 時間包解決方案Go 時間包其日期函數提供了一個方便的解決方案。 Date 的語法為:func D...
    程式設計 發佈於2024-11-08
  • 如何在不支援的瀏覽器中實現“背景濾鏡”效果?
    如何在不支援的瀏覽器中實現“背景濾鏡”效果?
    CSS:為不可用的背景過濾器提供替代方案CSS 中的背景過濾器功能在大多數現代瀏覽器中仍然無法訪問。雖然我們預計其未來的支持,但發現替代解決方案勢在必行。 實現類似效果的一種方法是採用具有微妙透明度的背景。下面的 CSS 程式碼示範了這個方法:/* Slightly transparent fall...
    程式設計 發佈於2024-11-08
  • Python 的 len() 函數對於不同的資料結構有多有效率?
    Python 的 len() 函數對於不同的資料結構有多有效率?
    理解Python內建資料結構中len()函數的成本Python中內建len()函數是決定各種資料結構長度的重要工具。它的效率至關重要,尤其是在處理大型資料集時。本文深入研究了 len() 對於不同內建資料類型(例如列表、元組、字串和字典)的計算成本。 O(1) 跨內建類型的複雜性關鍵要點是 len(...
    程式設計 發佈於2024-11-08
  • 如何在 Python 中存取 Windows 剪貼簿文字?
    如何在 Python 中存取 Windows 剪貼簿文字?
    在 Python 中存取 Windows 剪貼簿文字從 Windows 剪貼簿檢索文字是程式設計中的常見任務。本文探討如何使用 Python 的 win32clipboard 模組來實現此目的。 pywin32 和 win32clipboardwin32clipboard 模組是 pywin32 的...
    程式設計 發佈於2024-11-08
  • 如何修復 CentOS 5 上由於檔案權限問題導致的 Nginx 403 Forbidden 錯誤?
    如何修復 CentOS 5 上由於檔案權限問題導致的 Nginx 403 Forbidden 錯誤?
    Nginx 403 Forbidden:文件存取權限故障排除當在Nginx 中遇到令人沮喪的「403禁止」錯誤時,確定根本原因可以是一個挑戰。此錯誤通常表示對檔案或目錄的存取被拒絕。在該特定場景中,使用者在 CentOS 5 上使用 PHP-FPM 配置了 Nginx,但無法提供指定來源目錄中的任何...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3